package com.woniuxy.email.listener;

import com.rabbitmq.client.Channel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageProperties;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import java.io.IOException;

/**
 * @author yellow Docter
 * @date 2024-10-24
 * @desc 蜗牛创想：www.woniuxy.com
 */
@Component
@Slf4j
public class ConfirmListener {

    /**
     *  如果正常消费     消费者 会 进行 ack   消息就会被删除
     *  如果不正常消费   消息队列服务器认为消息未被消费，会将其重新投递给消费者，一直异常下去。
     * @param msg
     */
//    @RabbitListener(queues = "confirm.queue")
//    public  void handler(String msg){
//
//        //模拟消息 出现了异常
//        int a = 10 /0;
//
//        log.info("消费者消息确认:{}",msg);
//    }

    /**
     *
     * @param text        消息数据
     * @param channel     连接通道 (如果jdbc Connection 的连接对象 )
     * @param message     消息对象
     */
    @RabbitListener(queues = "confirm.queue")
    public  void handler(String text, Channel channel, Message message) throws IOException {

        //获取消息属性对象
        MessageProperties properties = message.getMessageProperties();
        //获取消息的唯一id
        long deliveryTag = properties.getDeliveryTag();
        //默认使用自动应答机制，从队列中获取消息后自动应答队列，队列收到应答后再从队列中移除消费后的消息
        try {
            //模拟业务逻辑
            System.out.println("接收到消息：" + text);
            //模拟出现异常
            System.out.println(1 / 0);
            //消费者手动确认消费消息
//            channel.basicAck(deliveryTag, false);

        } catch (Exception e) {
//            e.printStackTrace();
            //获取重投标记
            boolean redelivered = properties.getRedelivered();
            System.out.println("消息重发标记：" + redelivered);
            //如果为真就表示已经重投过了
            if (redelivered) {
                //消息已经被重投过，拒绝
                channel.basicReject(deliveryTag, false);
                System.out.println("消息已经重投过，被拒绝");
            } else {
                //消息没有被重投过，重投放到消息队列中
                channel.basicNack(deliveryTag, false, true);
                System.out.println("消息没有重投过，进行重投");
            }
        }
    }
}
